package com.android.otherappmainactivity;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;

import com.android.mainapp.IAppAidlInterface;

public class OtherAppMainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {
    private String TAG = "AIDL-OtherAppMainActivity";

    private int mICount = 0;
    private Intent mServiceIntent;
    private IAppAidlInterface mBinder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_other_app_main);

        mServiceIntent = new Intent(); // - 新建一个Intent，用于连接服务端mainappIntent的Component设置为Sevice的包名和类名
        mServiceIntent.setComponent(new ComponentName("com.android.mainapp", "com.android.mainapp.MainAppService"));

        findViewById(R.id.btnBindMainAppService).setOnClickListener(this);
        findViewById(R.id.btnUnBindMainAppService).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) { // 两个按钮点击事件
        int id = view.getId();
        if(id == R.id.btnBindMainAppService){ // 点击绑定按钮
            Log.v(TAG, "onClick()：btnBindMainAppService 点击绑定按钮");
            bindService(mServiceIntent, this, Context.BIND_AUTO_CREATE); // 绑定服务
        } else if(id ==R.id.btnUnBindMainAppService){ // 点击解绑按钮
            Log.v(TAG, "onClick()：btnUnBindMainAppService 点击解绑按钮");
            unbindService(this);
            mBinder = null;
        }
    }

    /**
     *
     mBinder = IAppAidlInterface.Stub.asInterface(iBinder);
     这行代码的作用是将传入的 IBinder 对象转换为 IAppAidlInterface 接口的实例。
     这是因为在 Android 中，使用 AIDL（Android Interface Definition Language）来实现跨进程通信，IAppAidlInterface.Stub.asInterface(iBinder) 方法用于将传入的 IBinder 对象转换为对应的 AIDL 接口实例。
     */
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        if (mBinder == null) {
            mBinder = IAppAidlInterface.Stub.asInterface(iBinder); // 获取服务端Binder对象
            mICount++;
            Log.v(TAG, "wcx onServiceConnected() 第 " + mICount + " 次");
            try {
                String strData = "第" + mICount + "次连接Service成功！";
                Log.v(TAG, "wcx 准备调用服务端的函数mBinder.setStringData");
                mBinder.setStringData(strData); // 调用服务端方法(setStringData函数)
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    }
    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        Log.v(TAG, "onServiceDisconnected 解除绑定");
    }
    @Override
    public void onBindingDied(ComponentName name) {
        Log.v(TAG, "onBindingDied 绑定已死");
    }
    @Override
    public void onNullBinding(ComponentName name) {
        Log.v(TAG, "onNullBinding 空绑定?");
    }
}